package dev.common.service.base;

import java.util.List;

/**
 * @program: JoyDev
 * @description: 查询接口
 * @author: MR.C
 * @create: 2018-02-07 15:32
 **/
public interface CrudService<T> {
    /**
     * @Description: 根据主键字段进行查询，方法参数必须包含完整的主键属性，查询条件使用等号
     * @Param: [record]
     * @return: T
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:35
     */
    T findByPrimaryKey(Object key);

    /**
     * @Description: 根据实体中的属性进行查询，只能有一个返回值，有多个结果是抛出异常，查询条件使用等号
     * @Param: [record]
     * @return: T
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:36
     */
    T findOne(T record);

    /**
     * @Description: 根据实体中的属性值进行查询，查询条件使用等号
     * @Param: [record]
     * @return: java.util.List<T>
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:36
     */
    List<T> find(T record);

    /**
     * @Description: 查询全部结果，find(null)方法能达到同样的效果
     * @Param: []
     * @return: java.util.List<T>
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:38
     */
    List<T> findAll();

    /**
     * @Description: 根据实体中的属性查询总数，查询条件使用等号
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:39
     */
    int findCount(T record);

    /**
     * @Description: 保存一个实体，null的属性也会保存，不会使用数据库默认值
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:48
     */
    int insert(T record);

    /**
     * @Description: 保存一个实体，null的属性不会保存，会使用数据库默认值
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:48
     */
    int insertSelective(T record);

    /**
     * @Description: 根据主键更新实体全部字段，null值会被更新
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:48
     */
    int updateByPrimaryKey(T record);

    /**
     * @Description: 根据主键更新属性不为null的值
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:49
     */
    int updateByPrimaryKeySelective(T record);

    /**
     * @Description: 根据实体属性作为条件进行删除，查询条件使用等号
     * @Param: [record]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:49
     */
    int delete(T record);

    /**
     * @Description: 根据主键字段进行删除，方法参数必须包含完整的主键属性
     * @Param: [key]
     * @return: int
     * @Author: Mr.Chen
     * @Date: 2018/2/7 下午3:49
     */
    int deleteByPrimaryKey(Object key);
}
